home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 40
/
Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso
/
Aminet
/
misc
/
emu
/
ATUtilities.lha
/
ATUtilities
/
hc.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-09-26
|
17KB
|
645 lines
/* ******************************************************************* */
/* ** ** */
/* ** ATKeyboard Hilfedateiencompiler ** */
/* ** Copright (C) 1992-1993 by Thomas Dreibholz ** */
/* ** All rights reserved ** */
/* ** ** */
/* ******************************************************************* */
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#define MAXSIZE(x) ((1000*5*22)+x)+1000000L
#define PAGE_INDEX 1
#define PAGE_TEXT 2
ULONG x,y,z;
UWORD i,j,k,zeile,a,b,t;
UBYTE style,fp,bp;
WORD cmd,page;
UBYTE chr;
ULONG offset;
UWORD length;
UBYTE s[500];
UBYTE byte;
UWORD wort;
ULONG langwort;
BOOL insert=FALSE;
UBYTE *name;
struct FileHandle *in,*out;
UWORD GoTo[100];
UWORD GoGad[100];
UBYTE GoPic[100];
UWORD GoToCnt;
UWORD GoGadCnt;
UBYTE GoPicCnt;
UWORD DefaultCnt;
UWORD Default[32];
UBYTE Buffer[2048];
ULONG Offset[1000];
ULONG MOffset[1000];
ULONG POffset[1000];
ULONG TOffset[1000];
ULONG GOffset[1000];
ULONG PNOffset[1000];
UWORD Length[1000];
UBYTE Flags[1000];
UBYTE mem[250];
UBYTE *InBuf,*OutBuf;
ULONG BufferSize;
ULONG IPos,OPos,IMax;
BOOL MainIndex;
VOID Out(m,len)
UBYTE *m;
ULONG len;
{
REGISTER ULONG i,j;
for(i=0;i<len;i++)
{
OutBuf[OPos]=m[i];
OPos++;
}
}
VOID WriteStyles()
{
sprintf(&mem,"\x9b%d;%d;%dm",style,fp,bp);
i=strlen(&mem);
Out(&mem,i);
offset+=i;
length+=i;
}
ULONG Get(m,len)
UBYTE *m;
ULONG len;
{
REGISTER ULONG i,j,x;
x=0;
for(i=0;((i<len) && (IPos<=IMax));i++)
{
m[i]=InBuf[IPos];
IPos++; x++;
}
return(x);
}
VOID Stop(num)
UWORD num;
{
Close(in);
Close(out);
DeleteFile(name);
FreeMem(InBuf,BufferSize);
switch(num)
{
case 1:
printf("Zeile %ld: #endpage für nicht vorhandene Seite.\n",zeile);
break;
case 2:
printf("Zeile %ld: #endpage erwartet.\n",zeile);
break;
case 3:
printf("Zeile %ld: #goto/#gpic/#gad steht auf keiner Seite.\n",zeile);
break;
case 4:
printf("Zeile %ld: Seitennummerangabe fehlerhaft.\n",zeile);
break;
case 5:
printf("Zeile %ld: Unbekannter Befehl.\n",zeile);
break;
case 6:
printf("Zeile %ld: #space steht auf keiner Seite.\n",zeile);
break;
case 7:
printf("Zeile %ld: Seitentext ohne Seitenangabe durch #page/#index.\n",zeile);
break;
case 8:
printf("Zeile %ld: Ungültige Bildnummer bei #gpic/picture.\n",zeile);
break;
case 20:
printf("Zeile %ld: #picture darf auf keiner Seite stehen.\n",zeile);
break;
case 30:
printf("Zeile %ld: Bild kann nicht geladen werden!\n",zeile);
break;
case 40:
printf("Zeile %ld: Seitennummerangabe bei #default fehlerhaft.\n",zeile);
break;
}
exit(0);
}
VOID main(argc,argv)
LONG argc;
UBYTE *argv[];
{
struct FileHandle *fh;
printf("\nATUtilities Online-Hilfe Hilfstextcompiler - Version 2.0 25. 11. 1993\n");
printf("Copyright (C) 1993 by Thomas Dreibholz. All rights reserved.\n");
printf("----------------------------------------------------------------------\n");
if(argc<3)
{
printf("Aufruf: %s [Quelltext] [Hilfedatei].\n",argv[0]);
exit(0);
}
if(argc>3)
{
if(!(strcmp(argv[3],"+I"))) insert=TRUE;
}
MainIndex=FALSE;
name=argv[2];
in=Open(argv[1],MODE_OLDFILE);
if(in!=NULL)
{
Seek(in,0,OFFSET_END);
IMax=Seek(in,0,OFFSET_BEGINNING);
BufferSize=IMax+MAXSIZE(IMax);
InBuf=AllocMem(BufferSize,MEMF_CLEAR|MEMF_PUBLIC);
if(InBuf!=NULL)
{
OutBuf=(UBYTE *)((ULONG)InBuf+IMax);
IPos=0; OPos=0;
out=Open(argv[2],MODE_NEWFILE);
if(out!=NULL)
{
printf("Lese Quelltext ...\n");
Read(in,InBuf,IMax);
cmd=-1;
page=-1;
zeile=0;
style=0; fp=33; bp=40;
Out("HELP_2.0",8);
offset=8;
printf("Compiliere Quelltext ...\n");
j=Get(&mem,1);
chr=mem[0];
while(j!=0)
{
if(chr=='#')
{
k=0; j=Get(&mem,1);
while((mem[k]!=10)&&(k<249)&&(j==1))
{
k++; j=Get(&mem[k],1);
}
mem[k]=0x00;
zeile++;
if(j!=0)
{
if(!(strncmp(&mem,"rem",3)))
{
/* Kommentarzeile */
}
else if(!(strncmp(&mem,"default",7)))
{
for(i=0;i<30;i++) Default[i]=0;
i=8;
DefaultCnt=0;
while(i<strlen(&mem))
{
if((mem[i]>='0')&&(mem[i]<='9'))
{
k=atol(&mem[i]);
i+=4;
if(k>999) Stop(40);
Default[DefaultCnt]=k; DefaultCnt++;
}
else
{
i+=2;
Default[DefaultCnt]=2000; DefaultCnt++;
}
}
}
else if(!(strncmp(&mem,"endpage",7)))
{
style=0; fp=33; bp=40;
if(page!=-1)
{
if(GoToCnt>0)
{
MOffset[page]=offset;
for(i=0;i<GoToCnt;i++)
{
Out(&GoTo[i],2L); offset+=2;
}
if(DefaultCnt>0)
{
wort=2000;
Out(&wort,2L); offset+=2;
}
}
if(DefaultCnt>0)
{
if(MOffset[page]==0) MOffset[page]=offset;
for(i=0;i<DefaultCnt;i++)
{
if(Default[i]!=page)
{
Out(&Default[i],2L); t=Default[i]; offset+=2;
}
else
{
if((i>0)&&(Default[i-1]==2000)&&(Default[i+1]==2000))
{
OPos-=2; offset-=2;
}
else if((i==0)&&(i<Default-1)&&(Default[i+1]==2000))
{
i++;
}
}
}
if(t==2000)
{
OPos-=2; offset-=2;
}
}
if(MOffset[page]!=0)
{
wort=0xFFFF;
Out(&wort,2L); offset+=2;
}
if(GoGadCnt>0)
{
GOffset[page]=offset;
wort=0xFFFF;
for(i=0;i<GoGadCnt;i++)
{
Out(&GoGad[i],2L); offset+=2;
}
Out(&wort,2L); offset+=2;
}
if(GoPicCnt>0)
{
POffset[page]=offset;
for(i=0;i<GoPicCnt;i++)
{
Out(&GoPic[i],1L); offset++;
}
byte=0xFF;
Out(&byte,1L); offset++;
}
Length[page]=length;
GoToCnt=0;
GoPicCnt=0;
GoGadCnt=0;
}
else Stop(1);
cmd=-1; page=-1;
}
else if(!(strncmp(&mem,"page",4)))
{
if(page!=-1)
{
Stop(2);
}
page=atol(&mem[5]);
if(page>999) Stop(4);
if(page==0)
{
MainIndex=TRUE;
printf("Info: Soll Seite 000 keine Indexseite sein?\n");
}
cmd=1;
Offset[page]=offset;
MOffset[page]=0;
TOffset[page]=0;
Length[page]=0;
Flags[page]=PAGE_TEXT;
a=9; b=0;
while((mem[a]>25)&&(b<290))
{
s[b]=mem[a]; a++; b++;
}
s[b]=0x00;
k=strlen(&s)+1;
offset+=k;
Out(&s,k);
length=0;
}
else if(!(strncmp(&mem,"picture",7)))
{
if(page!=-1)
{
Stop(20);
}
page=atol(&mem[8]);
if(page>99) Stop(8);
PNOffset[page]=offset;
a=11; b=0;
while((mem[a]>25)&&(b<290))
{
s[b]=mem[a]; a++; b++;
}
s[b]=0x00;
if(insert==FALSE)
{
byte=0;
Out(&byte,1L); offset++;
k=strlen(&s)+1;
offset+=k;
Out(&s,k);
}
else
{
byte=1;
Out(&byte,1L); offset++;
printf("Info: Bild %02ld <%s> wird eingefügt - ",page,&s);
fh=Open(&s,MODE_OLDFILE);
if(fh!=NULL)
{
Seek(fh,0,OFFSET_END);
z=Seek(fh,0,OFFSET_BEGINNING);
Out(&z,4L); offset+=4;
x=Read(fh,&Buffer,2048);
while(x>0)
{
Out(&Buffer,x); offset+=x;
x=Read(fh,&Buffer,2048);
}
printf("%ld KBytes.\n",z/1024);
Close(fh);
}
else
{
Stop(30);
}
}
page=-1;
}
else if(!(strncmp(&mem,"index",5)))
{
if(page!=-1)
{
Stop(2);
}
page=atol(&mem[5]);
if(page==0) MainIndex=TRUE;
if(page>999) Stop(4);
cmd=1;
MOffset[page]=0;
TOffset[page]=0;
Length[page]=0;
Offset[page]=offset;
Flags[page]=PAGE_INDEX;
a=10; b=0;
while((mem[a]>25)&&(b<290))
{
s[b]=mem[a]; a++; b++;
}
s[b]=0x00;
k=strlen(&s)+1;
offset+=k;
Out(&s,k);
length=0;
}
else if(!(strncmp(&mem,"goto",4)))
{
if(page!=-1)
{
k=atol(&mem[5]);
if(k>999) Stop(4);
if(k!=page)
{
GoTo[GoToCnt]=k; GoToCnt++;
}
}
else Stop(3);
}
else if(!(strncmp(&mem,"gad",3)))
{
if(page!=-1)
{
k=atol(&mem[4]);
if(k>999) Stop(4);
if(k!=page)
{
GoGad[GoGadCnt]=k; GoGadCnt++;
}
}
else Stop(3);
}
else if(!(strncmp(&mem,"gpic",4)))
{
if(page!=-1)
{
k=atol(&mem[5]);
if(k>99) Stop(8);
GoPic[GoPicCnt]=k; GoPicCnt++;
}
else Stop(3);
}
else if(!(strncmp(&mem,"space",5)))
{
if(page!=-1)
{
GoTo[GoToCnt]=2000; GoToCnt++;
}
else Stop(6);
}
else if(!(strncmp(&mem,"gspace",6)))
{
if(page!=-1)
{
GoGad[GoGadCnt]=2000; GoGadCnt++;
}
else Stop(6);
}
else if(!(strncmp(&mem,"pspace",6)))
{
if(page!=-1)
{
GoPic[GoPicCnt]=200; GoPicCnt++;
}
else Stop(6);
}
else if(!(strncmp(&mem,"endfile",7)))
{
goto ende;
}
else
{
Stop(5);
}
}
}
else
{
zeile++;
/* Seitentext */
if(cmd!=-1)
{
if(TOffset[page]==0) TOffset[page]=offset;
if(chr==10)
{
mem[0]=0;
Out(&mem,1); offset++; length++;
}
else
{
if(Flags[page]==PAGE_TEXT) WriteStyles();
IPos--;
j=Get(&mem,1);
while((j==1)&&(mem[0]!=10))
{
if((mem[0]=='`')&&(Flags[page]==PAGE_TEXT))
{
j=Get(&mem[1],1);
if((j==1)&&(mem[1]!='`'))
{
switch(toupper(mem[1]))
{
case 'F':
style=1;
break;
case 'K':
style=3;
break;
case 'U':
style=4;
break;
case 'I':
style=7;
break;
case 'N':
style=0;
break;
case 'R':
style=0; fp=33; bp=40;
break;
default:
if((mem[1]>='0')&&(mem[1]<='8'))
{
j=Get(&mem[2],1);
if(j==1)
{
if((mem[2]>='0')&&(mem[2]<='8'))
{
fp=(mem[1]-48)+30;
bp=(mem[2]-48)+40;
}
}
}
break;
}
WriteStyles();
}
else
{
if(j==1)
{
mem[0]='`';
Out(&mem,1); offset++; length++;
}
}
}
else
{
Out(&mem,1); offset++; length++;
}
j=Get(&mem,1);
}
mem[0]=0x00;
Out(&mem,1); offset++; length++;
}
}
else
{
Stop(7);
}
}
j=Get(&mem,1);
chr=mem[0];
}
ende:
byte=0; langwort=offset;
for(i=0;i<1000;i++)
{
if(Offset[i]==0)
{
Out(&byte,1); offset++;
}
else
{
Out(&Flags[i],1);
Out(&Length[i],2);
Out(&Offset[i],4);
Out(&TOffset[i],4);
Out(&GOffset[i],4);
Out(&MOffset[i],4);
Out(&POffset[i],4);
offset+=1;
offset+=2;
offset+=4;
offset+=4;
offset+=4;
offset+=4;
offset+=4;
}
}
for(i=0;i<100;i++)
{
Out(&PNOffset[i],4);
offset+=4;
}
Out(&langwort,4); offset+=4;
printf("Check: %lx - %lx\n",OPos,offset);
printf("Schreibe Hilfe-Datei ...\n");
langwort=Write(out,OutBuf,OPos);
Close(out);
if(langwort!=OPos)
{
printf("FEHLER! Übersetzte Hilfe-Datei kann nicht gespeichert werden!\n");
DeleteFile(argv[2]);
}
printf("Fertig.\n");
}
else
{
printf("Ausgabedatei \"%s\" konnte nicht eröffnet werden!\n",argv[2]);
}
FreeMem(InBuf,BufferSize);
}
else
{
printf("Nicht genug Speicher für Compiliervorgang!\n");
}
Close(in);
}
else
{
printf("Eingabedatei \"%s\" konnte nicht geöffnet werden!\n",argv[1]);
}
exit(0);
}